#include "./includes/PilasListasColas.h"
#include "includes/LeerYGrabarSector.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void agregar (ptrNodoCola *ColaFte,ptrNodoCola *ColaFin,sector_t sector){
	ptrNodoCola ptrNuevo;
	ptrNuevo=malloc(sizeof(nodoCola_t));
	ptrNuevo->peticion=sector.idSector;
	memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
	ptrNuevo->tipoPedido=sector.tipoOperacion;
	ptrNuevo->socket=sector.socket;
	ptrNuevo->movimiento=sector.movimiento;
	ptrNuevo->ptrSgte=NULL;

	if(*ColaFte==NULL) {
		*ColaFte=ptrNuevo;
	}
	else{
		(*ColaFin)->ptrSgte=ptrNuevo;
	}
	*ColaFin=ptrNuevo;
}

sector_t suprimir (ptrNodoCola *ColaFte, ptrNodoCola *ColaFin){
	ptrNodoCola ptr;
	sector_t sector;
	ptr=*ColaFte;
	(*ColaFte)=(*ColaFte)->ptrSgte;
	if (*ColaFte==NULL){
		*ColaFin=NULL;
	}
	sector.idSector=ptr->peticion;
	memcpy(sector.datos,&ptr->infoSector,BytesxSector);
	sector.tipoOperacion=ptr->tipoPedido;
	sector.socket=ptr->socket;
	sector.movimiento=ptr->movimiento;
	ptr->ptrSgte=NULL;
	free(ptr);
	return sector;
}

int32_t estaVaciaCola (ptrNodoCola ColaFte){
	if(ColaFte == NULL){
		return 1;   //returna verdadero
	}
	else{
		return 0;   // returna falso
	}
}

void mostrarCola (ptrNodoCola ColaFte){
	ptrNodoCola ptr;
	ptr=ColaFte;
	if (ptr == NULL){
		printf("La cola esta vacia.\n\n");
	}
	else{
		printf("La cola es: \n");
		while(ptr !=NULL){
			printf("%d --> ", ptr->peticion);
			ptr=ptr->ptrSgte;
		}
		printf("NULL\n\n");
	}
}

void insertarNodo (ptrNodoLista *Lista,sector_t sector)
{
	ptrNodoLista ptrNuevo;
	ptrNodoLista ptr;
	ptrNodoLista ptrActual;
	ptrNuevo = malloc(sizeof(nodoLista_t));
		if(ptrNuevo != NULL){    //significa que se pudo reservar la memoria

		ptrActual = *Lista;
			if((ptrActual == NULL) || (sector.idSector < ptrActual->peticion)){
				ptrNuevo->peticion = sector.idSector;
				ptrNuevo->tipoPedido=sector.tipoOperacion;
				memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
				ptrNuevo->socket=sector.socket;
				ptrNuevo->movimiento=sector.movimiento;
				ptrNuevo->ptrSgte = *Lista;
				*Lista=ptrNuevo;
			}
			else{
				ptrNuevo->peticion = sector.idSector;
				ptrNuevo->tipoPedido=sector.tipoOperacion;
				memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
				ptrNuevo->socket=sector.socket;
				ptrNuevo->movimiento=sector.movimiento;
				ptr=*Lista;
				while((ptr->ptrSgte != NULL)&&(sector.idSector > (ptr->ptrSgte)->peticion)){
					ptr = ptr->ptrSgte;
				}
				ptrNuevo->ptrSgte = ptr->ptrSgte;
				ptr->ptrSgte = ptrNuevo;
			}
		}//fin del if de si se reservo memoria
		else{
			printf("no se tienes memoria suficiente");
		}
}

sector_t suprimirNodo (ptrNodoLista *Lista,sector_t sector){
	ptrNodoLista ptr;
	ptrNodoLista ptrAnt;

	if ((*Lista)->peticion == sector.idSector){
		ptr=*Lista;
		*Lista=(*Lista)->ptrSgte;
		sector.idSector=ptr->peticion;
		memcpy(sector.datos,&ptr->infoSector,BytesxSector);
		sector.tipoOperacion=ptr->tipoPedido;
		sector.socket=ptr->socket;
		sector.movimiento=ptr->movimiento;
		free(ptr);
		return sector;
	}
	else{
		ptrAnt=(*Lista);
		ptr=(*Lista)->ptrSgte;
		while(ptr!=NULL && ptr->peticion != sector.idSector){
			ptrAnt=ptr;
			ptr=ptr->ptrSgte;
		}
		if(ptr!=NULL){
			ptrAnt->ptrSgte=ptr->ptrSgte;
			sector.idSector=ptr->peticion;
			memcpy(sector.datos,&ptr->infoSector,BytesxSector);
			sector.tipoOperacion=ptr->tipoPedido;
			sector.socket=ptr->socket;
			sector.movimiento=ptr->movimiento;
			free(ptr);
			return sector;
		}
	}
	sector.idSector=-1;
	return sector;
}

int32_t estaVaciaLista (ptrNodoLista Lista){
	if(Lista == NULL){ // si la lista esta vacia
		return 1;   //returna verdadero
	}
	else{
		return 0;   // returna falso
	}
}

void mostrarLista (ptrNodoLista Lista){
	ptrNodoLista ptr;
	ptr=Lista;
	if (ptr == NULL){
		printf("La lista esta vacia.\n\n");
	}
	else{
		printf("La lista es: \n");
		while(ptr !=NULL){
			printf("%d --> ", ptr->peticion);
			ptr=ptr->ptrSgte;
		}
		printf("NULL\n\n");
	}
}

void insertarNodoSubiendo(ptrNodoLista *Lista,sector_t sector)
{
	ptrNodoLista ptrNuevo;
	ptrNodoLista ptr;
	ptrNodoLista ptrActual;
	ptrNuevo = malloc(sizeof(nodoLista_t));
		if(ptrNuevo != NULL){    //significa que se pudo reservar la memoria
		ptrActual = *Lista;
			if((ptrActual == NULL) || (sector.idSector < ptrActual->peticion)){
				ptrNuevo->peticion = sector.idSector;
				ptrNuevo->tipoPedido=sector.tipoOperacion;
				memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
				ptrNuevo->ptrSgte = *Lista;
				ptrNuevo->socket=sector.socket;
				ptrNuevo->movimiento=sector.movimiento;
				*Lista=ptrNuevo;
			}
			else{
				ptrNuevo->peticion = sector.idSector;
				ptrNuevo->tipoPedido=sector.tipoOperacion;
				memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
				ptrNuevo->socket=sector.socket;
				ptrNuevo->movimiento=sector.movimiento;
				ptr=*Lista;
				while((ptr->ptrSgte != NULL)&&(sector.idSector > (ptr->ptrSgte)->peticion)){
					ptr = ptr->ptrSgte;
				}
				ptrNuevo->ptrSgte = ptr->ptrSgte;
				ptr->ptrSgte = ptrNuevo;
			}
		}//fin del if de si se reservo memoria
		else{
			printf("no se tienes memoria suficiente");
		}
}

void insertarNodoBajando(ptrNodoLista *Lista,sector_t sector)
{
	ptrNodoLista ptrNuevo;
	ptrNodoLista ptr;
	ptrNodoLista ptrActual;
	ptrNuevo = malloc(sizeof(nodoLista_t));
		if(ptrNuevo != NULL){    //significa que se pudo reservar la memoria

		ptrActual = *Lista;
			if((ptrActual == NULL) || (sector.idSector > ptrActual->peticion)){
				ptrNuevo->peticion = sector.idSector;
				ptrNuevo->tipoPedido=sector.tipoOperacion;
				memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
				ptrNuevo->socket=sector.socket;
				ptrNuevo->movimiento=sector.movimiento;
				ptrNuevo->ptrSgte = *Lista;
				*Lista=ptrNuevo;
			}
			else{
				ptrNuevo->peticion = sector.idSector;
				ptrNuevo->tipoPedido=sector.tipoOperacion;
				memcpy(&ptrNuevo->infoSector,sector.datos,BytesxSector);
				ptrNuevo->socket=sector.socket;
				ptrNuevo->movimiento=sector.movimiento;
				ptr=*Lista;
				while((ptr->ptrSgte != NULL)&&(sector.idSector < (ptr->ptrSgte)->peticion)){
					ptr = ptr->ptrSgte;
				}
				ptrNuevo->ptrSgte = ptr->ptrSgte;
				ptr->ptrSgte = ptrNuevo;
			}
		}//fin del if de si se reservo memoria
		else{
			printf("no se tienes memoria suficiente");
		}
}

sector_t suprimirPrimerNodo (ptrNodoLista *Lista){
	ptrNodoLista ptr;
	sector_t sector;
	ptr = *Lista;
	*Lista = (*Lista)->ptrSgte;
	sector.idSector=ptr->peticion;
	memcpy(sector.datos,&ptr->infoSector,BytesxSector);
	sector.tipoOperacion=ptr->tipoPedido;
	sector.socket=ptr->socket;
	sector.movimiento=ptr->movimiento;
	free(ptr);
	return sector;
}

void meter (ptrNodoPila *Pila, int32_t info){
	ptrNodoPila ptrNuevo;
	ptrNuevo = malloc(sizeof(nodoPila_t));
	ptrNuevo->peticion=info;
		if(*Pila==NULL){
			*Pila=ptrNuevo;
			(*Pila)->ptrSgte=NULL;
		}
		else{
			ptrNuevo->ptrSgte=*Pila;
			*Pila=ptrNuevo;
		}
}

int32_t sacar (ptrNodoPila *Pila){
	ptrNodoPila ptr;
	int32_t valorEliminado;
	ptr=*Pila;
	*Pila=(*Pila)->ptrSgte;
	valorEliminado=ptr->peticion;
	free(ptr);
	return valorEliminado;
}

int32_t estaVaciaPila (ptrNodoPila Lista){
	if(Lista == NULL){ // si la lista esta vacia
		return 1;   //returna verdadero
	}
	else{
		return 0;   // returna falso
	}
}

void mostrarPila (ptrNodoPila Pila){
	ptrNodoPila ptr;
	ptr=Pila;
	if (ptr == NULL){
		printf("La pila esta vacia.\n\n");
	}
	else{
		printf("La pila es: \n");
		while(ptr !=NULL){
			printf("%d --> ", ptr->peticion);
			ptr=ptr->ptrSgte;
		}
		printf("NULL\n\n");
	}
}








